﻿using GameProtocol.Protocol;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace NetCommon
{
    /// <summary>
    /// 消息编码解码器
    /// </summary>
    public class MessageEncoding
    {
        /// <summary>
        /// 消息编码——序列化 （对象转换成数据）
        /// </summary>
        /// <param name="value"></param>
        /// <returns></returns>
        public static byte[] Encoding(object value)
        {
            byte[] ret = null;
            NetModel model = value as NetModel;
            //实例化一个工具对象
            ByteArray ba = new ByteArray();
            /**写入数据的流程*/
            //1.向流里 写入 模块号
            ba.Write(model.protocal);
            //2.向流里 写入 命令号（协议号）
            ba.Write(model.commond);
            //3.判断要传输的消息里面有没有数据，有的话就写入
            if (model.message != null)
            {
                //如果有数据要传输
                ba.Write(model.message);
            }
            ret = ba.GetBuff();//取到byte[]
            ba.Close();
            return ret;
        }

        /// <summary>
        /// 消息解码，反序列化 （把二进制数据转换为对象）
        /// </summary>
        /// <returns></returns>
        public static object Decode(byte[] value)
        {
            NetModel model = new NetModel();
            //实例化一个工具对象
            ByteArray ba = new ByteArray(value);
            Protocal type; //模块号
            short commond; //模块命令
            ba.Read(out type);
            ba.Read(out commond);

            model.protocal = type;
            model.commond = commond;
            if (ba.Readable)
            {
                object msg;
                //字节流： 模块号 + 协议号 + 数据信息
                ba.Read(ba.Length - ba.Position, out msg);
                model.message = msg;
            }
            ba.Close();
            return model;
        }
    }
}
